home *** CD-ROM | disk | FTP | other *** search
/ Java Primer Plus / Java Primer Plus (Waite Group Proess)(1996).iso / java_Win / demo / TumblingDuke / TumbleItem.java < prev   
Text File  |  1995-10-13  |  5KB  |  172 lines

  1. /*
  2.  * @(#)Tumble.java    
  3.  *
  4.  * Copyright (c) 1994-1995 Sun Microsystems, Inc. All Rights Reserved.
  5.  *
  6.  * Permission to use, copy, modify, and distribute this software
  7.  * and its documentation for NON-COMMERCIAL or COMMERCIAL purposes and
  8.  * without fee is hereby granted. 
  9.  * Please refer to the file http://java.sun.com/copy_trademarks.html
  10.  * for further important copyright and trademark information and to
  11.  * http://java.sun.com/licensing.html for further important licensing
  12.  * information for the Java (tm) Technology.
  13.  * 
  14.  * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
  15.  * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
  16.  * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
  17.  * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
  18.  * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
  19.  * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
  20.  * 
  21.  * THIS SOFTWARE IS NOT DESIGNED OR INTENDED FOR USE OR RESALE AS ON-LINE
  22.  * CONTROL EQUIPMENT IN HAZARDOUS ENVIRONMENTS REQUIRING FAIL-SAFE
  23.  * PERFORMANCE, SUCH AS IN THE OPERATION OF NUCLEAR FACILITIES, AIRCRAFT
  24.  * NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL, DIRECT LIFE
  25.  * SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH THE FAILURE OF THE
  26.  * SOFTWARE COULD LEAD DIRECTLY TO DEATH, PERSONAL INJURY, OR SEVERE
  27.  * PHYSICAL OR ENVIRONMENTAL DAMAGE ("HIGH RISK ACTIVITIES").  SUN
  28.  * SPECIFICALLY DISCLAIMS ANY EXPRESS OR IMPLIED WARRANTY OF FITNESS FOR
  29.  * HIGH RISK ACTIVITIES.
  30.  */
  31.  
  32. import java.io.InputStream;
  33. import java.applet.Applet;
  34. import java.awt.*;
  35. import java.net.*;
  36.  
  37. /**
  38.  * A simple Item class to play an image loop.  The "img" tag parameter
  39.  * indicates what image loop to play.
  40.  *
  41.  * @author     James Gosling
  42.  * @version     1.17, 31 Jan 1995
  43.  */
  44. public
  45. class TumbleItem extends Applet implements Runnable {
  46.     /**
  47.      * The current loop slot.
  48.      */
  49.     int loopslot = 0;
  50.  
  51.     /**
  52.      * The directory or URL from which the images are loaded
  53.      */
  54.     String dir;
  55.  
  56.     /**
  57.      * The thread animating the images.
  58.      */
  59.     Thread kicker = null;
  60.  
  61.     /**
  62.      * The length of the pause between revs.
  63.      */
  64.     int pause;
  65.  
  66.     int offset;
  67.     int off;
  68.     int speed;
  69.     int nimgs;
  70.  
  71.     /**
  72.      * The images.
  73.      */
  74.     Image imgs[];
  75.     int maxWidth;
  76.  
  77.     /**
  78.      * Initialize the applet. Get attributes.
  79.      */
  80.     public void init() {
  81.     String at = getParameter("img");
  82.     dir = (at != null) ? at : "images/tumble";
  83.     at = getParameter("pause");
  84.     pause = (at != null) ? Integer.valueOf(at).intValue() : 3900;
  85.     at = getParameter("offset");
  86.     offset = (at != null) ? Integer.valueOf(at).intValue() : 0;
  87.     at = getParameter("speed");
  88.     speed = (at != null) ? (1000 / Integer.valueOf(at).intValue()) : 100;
  89.     at = getParameter("nimgs");
  90.     nimgs = (at != null) ? Integer.valueOf(at).intValue() : 16;
  91.     at = getParameter("maxwidth");
  92.     maxWidth = (at != null) ? Integer.valueOf(at).intValue() : 0;
  93.     }
  94.  
  95.     /**
  96.      * Run the image loop. This methods is called by class Thread.
  97.      * @see java.lang.Thread
  98.      */
  99.     public void run() {
  100.     Thread.currentThread().setPriority(Thread.NORM_PRIORITY-1);
  101.     imgs = new Image[nimgs];
  102.     for (int i = 1; i < nimgs; i++) {
  103.         imgs[i] = getImage(getDocumentBase(), dir + "/T" + i + ".gif");
  104.     }
  105.  
  106.     Dimension d = size();
  107.     if (nimgs > 1) {
  108.         if (offset < 0) {
  109.         off = d.width - maxWidth;
  110.         }
  111.         while (kicker != null) {
  112.         //System.out.println("frame = " +  loopslot);
  113.         if (++loopslot >= nimgs) {
  114.             loopslot = 0;
  115.             off += offset;
  116.             if (off < 0) {
  117.             off = d.width - maxWidth;
  118.             } else if (off + maxWidth > d.width) {
  119.             off = 0;
  120.             }
  121.         }
  122.         repaint();
  123.         try {
  124.             Thread.sleep(speed + ((loopslot == nimgs - 1) ? pause : 0));
  125.         } catch (InterruptedException e) {
  126.             break;
  127.         }
  128.         }
  129.     }
  130.     }
  131.  
  132.     public boolean imageUpdate(Image img, int flags,
  133.                    int x, int y, int w, int h) {
  134.     if ((flags & (SOMEBITS|FRAMEBITS|ALLBITS)) != 0) {
  135.         if ((imgs != null) && (loopslot < nimgs) && (imgs[loopslot] == img)) {
  136.         repaint(100);
  137.         }
  138.     }
  139.     return (flags & (ALLBITS|ERROR)) == 0;
  140.     }
  141.  
  142.     /**
  143.      * Paint the current frame.
  144.      */
  145.     public void paint(Graphics g) {
  146.     //System.out.println("paint");
  147.     if ((imgs != null) && (loopslot < nimgs) && (imgs[loopslot] != null)) {
  148.         g.drawImage(imgs[loopslot], off, 0, this);
  149.     }
  150.     }
  151.  
  152.     /**
  153.      * Start the applet by forking an animation thread.
  154.      */
  155.     public void start() {
  156.     if (kicker == null) {
  157.         kicker = new Thread(this);
  158.         kicker.start();
  159.     }
  160.     }
  161.  
  162.     /**
  163.      * Stop the applet. The thread will exit because kicker is set to null.
  164.      */
  165.     public void stop() {
  166.     if (kicker != null) {
  167.         kicker.stop();
  168.         kicker = null;
  169.     }
  170.     }
  171. }
  172.